// https://github.com/rollup/awesome

import alias from '@rollup/plugin-alias' //  导入 alias 别名插件
import replace from '@rollup/plugin-replace' // 导入 replace 替换插件
import { nodeResolve } from '@rollup/plugin-node-resolve' // 导入 node 解析插件
import commonjs from '@rollup/plugin-commonjs' // 导入 commonjs 解析插件
import { getBabelOutputPlugin } from '@rollup/plugin-babel' // 导入 babel js语法兼容性转换插件
import json from '@rollup/plugin-json' // 导入 json 解析插件
import typescript from '@rollup/plugin-typescript' // 导入 typescript 解析转换插件
import { terser } from 'rollup-plugin-terser' // 导入 terser 压缩插件

import pkg from './package.json'

// const pathResolve = dir => path.resolve(__dirname, dir)

export default [
  {
    // rollup ./src/index.ts --file dist/bundle.js --format umd --name Index
    input: './src/index.ts', // 打包入口文件
    external: ['lodash'], // 不将第三方库源码打包进来
    /* 输出 */
    output: [
      {
        file: 'dist/bundle.js', // 打包输出文件
        /* format(代码格式化方式)
         * amd – 异步模块定义，用于像RequireJS这样的模块加载器
         * cjs – CommonJS，适用于 Node 和 Browserify/Webpack
         * esm – 将软件包保存为 ES 模块文件，在现代浏览器中可以通过 <script type=module> 标签引入
         * iife – 一个自动执行的功能，适合作为<script>标签。（如果要为应用程序创建一个捆绑包，您可能想要使用它，因为它会使文件大小变小。）
         * umd – 通用模块定义，以amd，cjs 和 iife 为一体
         * system - SystemJS 加载器格式
         */
        format: 'umd', // 默认为 esm
        name: 'Index', // 变量名，代表你的 iife/umd 包，同一页上的其他脚本可以访问它
        /* exports(导出模式)
         * default – 如果你使用 export default ... 仅仅导出一个东西，那适合用这个
         * named – 如果你导出多个东西，适合用这个
         * none – 如果你不导出任何内容 (例如，你正在构建应用程序，而不是库)，则适合用这个
         */
        exports: 'auto', // 默认为auto，它根据entry模块导出的内容猜测你的意图
        // 字符串以 前置 banner / 追加 footer 到 bundle。(注意:“banner”和“footer”选项不会破坏sourcemaps)
        banner: '/* This is a banner ! */',
        footer: '/* This is a footer ! */'
      },
      {
        file: 'dist/bundle.min.js',
        format: 'umd',
        name: 'Version',
        exports: 'auto',
        plugins: [terser()]
      }
    ],
    /* 监听 - 这些选项仅在运行 Rollup 时使用 --watch 标志或使用 rollup.watch 时生效。 */
    watch: {
      include: 'src/**', // 限制文件监控至某些文件
      exclude: 'node_modules/**' // 防止文件被监控
    },
    /* 插件 */
    plugins: [
      // 使用 alias 别名定义插件
      alias({
        entries: {
          // src: pathResolve('src')
          src: './src'
        },
        customResolver: nodeResolve({
          extensions: ['.ts', '.tsx', '.mjs', '.js', '.jsx', '.json', '.scss']
        })
      }),
      // 类似 webpack definePlugin 定义常量
      replace({
        preventAssignment: true,
        'process.env.NODE_ENV': JSON.stringify('production'),
        __buildDate__: () => JSON.stringify(new Date()),
        __buildVersion: pkg.version
      }),
      nodeResolve(), // 使用 node 解析插件 用于在 node_modules 中使用第三方模块
      commonjs(), // 使用 commonjs 解析插件 用于将 CommonJS 模块转换为 ES6
      // 使用 babel 转换插件
      getBabelOutputPlugin({
        allowAllFormats: true, // 默认 babel 只格式化 esm 与 cjs
        presets: ['@babel/preset-env'] // 使用 @babel/preset-env 预设 用于将 ES6+ 语法转换为浏览器能识别的语法
      }),
      json(), // 使用 JSON 插件 用于解析 json 文件
      typescript() // 使用 typescript 解析插件 用于解析编译 ts 文件
    ]
  }
  // {
  //   ...
  // }
]
